#ifndef __HOST_DATA_H__
#define __HOST_DATA_H__
#include <rtdevice.h>
#include "host_data_type.h"
#define get_member_offset(type, member)     ((rt_uint32_t)&((type *)0)->member)


struct Prog_Step
{
    rt_uint8_t stepNbr;             /* 多段式控温步骤号 */
    rt_uint8_t stepMode;            /* 多段式控温步骤模式 */
    rt_int16_t stepSv;              /* 多段式控温步骤设定温度(小数位随单位变化) */
    rt_uint16_t stepAdjustTime;     /* 多段式控温步骤升降温时间 */
    rt_uint16_t stepHoldTime;       /* 多段式控温步骤恒温时间 */
    rt_uint8_t stepLoopCnt;         /* 多段式控温当前步骤重复次数 */
    struct Prog_Step *stepNext;      /* 多段式控温下一步骤 */
};

struct Host_Data
{
    rt_int16_t sv;                  /* 设定温度(小数位随单位变化) */
    rt_uint8_t workMode;            /* 工作模式 */
    rt_uint8_t atEnable;            /* AT模式 */
    rt_uint8_t tecCtrlMode;         /* TEC控制模式 */
    rt_int16_t tecPower;            /* TEC输出(0.1%) */
    rt_uint16_t pidKp;              /* PID_P参数 */
    rt_uint16_t pidKi;              /* PID_I参数 */
    rt_uint16_t pidKd;              /* PID_D参数 */
    rt_uint8_t pidMode;             /* PID模式 */
    rt_int16_t tempAlarmLow;        /* 温度下限报警(小数位随单位变化) */
    rt_int16_t tempAlarmHigh;       /* 温度上限报警(小数位随单位变化) */
    rt_int16_t svOffset;            /* 温度设定偏移（固定2位小数） */
    rt_int16_t pvOffset;            /* 温度测量偏移（固定2位小数） */
    rt_uint8_t tecOutputDir;        /* TEC输出方向 */
    rt_uint8_t tempSensorType;      /* 温度传感器类型 */
    rt_uint8_t tempUnit;            /* 温度单位 */
    rt_uint8_t decimalPointNbr;     /* UI中小数位数 */
    rt_int16_t displayRangeLow;     /* 显示范围下限 */
    rt_int16_t displayRangeHigh;    /* 显示范围上限 */
    rt_uint8_t filterDegree;        /* 过滤次数 */
    rt_uint8_t mbSlaverAddr;        /* Modbus地址 */
    rt_uint8_t mbBaudrateID;        /* 串口波特率 */
    rt_uint8_t powerOnAutoRun;      /* 上电自动运行 */
    rt_uint16_t steadyAlarmRange;   /* 稳态报警范围(固定两位小数) */
    rt_uint16_t tecMaxPower;        /* TEC最大功率(0.1%) */
    rt_uint8_t mbCrcEnable;         /* Modbus CRC校验开关（保留） */
    rt_uint8_t errorCode;           /* 错误码 */
    rt_uint8_t progStart;           /* 多段式控温启动 */
    rt_uint8_t progCurrentStep;     /* 多段式控温当前步骤 */
    rt_uint8_t progTimeUnitAdjust;  /* 多段式控温升降温过程时间单位 */
    rt_uint8_t progTimeUnitHold;    /* 多段式控温恒温过程时间单位 */
    rt_uint16_t progTempAcceptance; /* 多段式控温温度容差(固定为一位小数) */
    struct Prog_Step progList[8];   /* 多段式控温参数列表 */
    rt_uint8_t tempCalibPointNbr;   /* 校准点数 */
    rt_int16_t tempCalibReal[10];   /* 温度校准实际温度(固定两位小数) */
    rt_int16_t tempCalibSet[10];    /* 温度校准设定温度(固定两位小数) */    
};
typedef struct Host_Data *Host_Data_t;

extern Host_Data_t host_data;
extern struct rt_fram_device *fram_dev;

/* host data init*/
void host_data_init(void);
/* host data factory */
void host_data_factory(void);
/* print host data*/
void host_data_print(void);
/* host data set functions */
void host_data_set_sv(rt_int16_t value);
void host_data_set_tempAlarmLow(rt_int16_t value);
void host_data_set_tempAlarmHigh(rt_int16_t value);
void host_data_set_atEnable(rt_uint8_t value);
void host_data_set_tecCtrlMode(rt_uint8_t value);
void host_data_set_tecPower(rt_int16_t value);
void host_data_set_workMode(rt_uint8_t value);
void host_data_set_pidKp(rt_uint16_t value);
void host_data_set_pidKi(rt_uint16_t value);
void host_data_set_pidKd(rt_uint16_t value);
void host_data_set_pidMode(rt_uint8_t value);
void host_data_set_svOffset(rt_int16_t value);
void host_data_set_pvOffset(rt_int16_t value);
void host_data_set_tecOutputDir(rt_uint8_t value);
void host_data_set_tempSensorType(rt_uint8_t value);
void host_data_set_tempUnit(rt_uint8_t value);
void host_data_set_decimalPointNbr(rt_uint8_t value);
void host_data_set_displayRangeLow(rt_int16_t value);
void host_data_set_displayRangeHigh(rt_int16_t value);
void host_data_set_filterDegree(rt_uint16_t value);
void host_data_set_mbSlaverAddr(rt_uint8_t value);
void host_data_set_mbBaudrateID(rt_uint8_t value);
void host_data_set_powerOnAutoRun(rt_uint8_t value);
void host_data_set_steadyAlarmRange(rt_uint16_t value);
void host_data_set_tecMaxPower(rt_uint8_t value);
void host_data_set_mbCrcEnable(rt_uint8_t value);
void host_data_set_errorCode(rt_uint8_t value);
void host_data_set_tempCalibPointNbr(rt_uint8_t value);
void host_data_set_tempCalibReal(rt_uint8_t index, rt_int16_t value);
void host_data_set_tempCalibSet(rt_uint8_t index, rt_int16_t value);
void host_data_set_progStart(rt_uint8_t value);
void host_data_set_progCurrentStep(rt_uint8_t value);
void host_data_set_progTimeUnitAdjust(rt_uint8_t value);
void host_data_set_progTimeUnitHold(rt_uint8_t value);
void host_data_set_progTempAcceptance(rt_uint8_t value);
void host_data_set_progStepMode(rt_uint8_t index, rt_uint8_t value);
void host_data_set_progStepSv(rt_uint8_t index, rt_int16_t value);
void host_data_set_progStepAdjustTime(rt_uint8_t index, rt_uint16_t value);
void host_data_set_progStepHoldTime(rt_uint8_t index, rt_uint16_t value);
void host_data_set_progStepLoopCnt(rt_uint8_t index, rt_uint8_t value);
void host_data_set_progStepNext(rt_uint8_t index, rt_uint8_t progStepNextNbr);


#endif